/**
  ******************************************************************************
  * @file    main.c
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   演示内置BGR 1.2V模块测量AVCC，采用软件启动+软件查询方式进行转换
  *          转换完成的结果通过UART2.TXD(PB02)发出，115200-8-N-1
  *          请使用串口调试助手接收显示串口发送的数据
  *          注意：当AVCC电压大于1.8V时，才能采用内置BGR1.2V作为参考电压
  *
  * @note    硬件平台：SYM32L010_StartKit_V1.0
  *          接线说明：断开J12
  *                    短接J13
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "main.h"
#include "sym32l010_hal_sysctrl.h"
#include "sym32l010_hal_systick.h"
#include "sym32l010_hal_gpio.h"
#include "sym32l010_hal_adc.h"
#include "sym32l010_startkit_board.h"


/******************************************************************************/
/* Local pre-processor symbols/macros ('#define')                             */
/******************************************************************************/

/******************************************************************************/
/* Global variable definitions (declared in header file with 'extern')        */
/******************************************************************************/

/******************************************************************************/
/* Local type definitions ('typedef')                                         */
/******************************************************************************/

/******************************************************************************/
/* Local function prototypes ('static')                                       */
/******************************************************************************/
static void ADC_Init(void);

/******************************************************************************/
/* Local variable definitions ('static')                                      */
/******************************************************************************/

/******************************************************************************/
/* Local pre-processor symbols/macros ('#define')                             */
/******************************************************************************/

/******************************************************************************/
/* Function implementation - global ('extern') and local ('static')           */
/******************************************************************************/


/*******************************************************************************
 ** \brief  Main function of project
 **
 ** \return uint32_t return value, if needed
 **
 **
 ******************************************************************************/
int32_t main(void)
{
    // 配置系统时钟
    HAL_SysCtrl_HSI_SetDiv(HSIOSC_TO_HSI48MHZ);

    // 初始化SysTick
    HAL_InitTick(48000000);

    // 初始化板载UART  115200-8-N-1
    Bsp_Uart_Init(48000000, 115200);

    // 初始化 板载电位器的端口
    Bsp_RheostatPort_Init();

    // 初始化ADC
    ADC_Init();

    //------------------------------------------------------------
    // 通过 UART 查看ADC转换完成的结果 及 反算出的AVCC电压值
    while (1)
    {
        uint32_t sum = 0;
        for (int i = 0; i < 32; i++)
        {
            HAL_ADC_Start();                                          // 启动ADC单通道多次转换
            HAL_ADC_WaitComplete();                                   // 查询等待ADC转换完成
            sum += HAL_ADC_Result0_Read();                            // 读取32次转换的累加值
        }
        uint16_t tmp16 = sum / 32;                                    // 计算32次的平均值
        float Avcc = HAL_ADC_BgrResult2Avcc(tmp16);                   // 获取AVCC的电压

        printf("AdcCode = 0x%X    CalcAVCC = %4.3fV\r\n", tmp16, Avcc);
        HAL_Delay(500);
    }
}


/*******************************************************************************
 * @brief  ADC 初始化函数
 * @param  None
 * @retval None
 *
 */
static void ADC_Init(void)
{
    ADC_InitTypeDef             ADC_InitStruct;
    ADC_SqrInitTypeDef          ADC_SqrInitStruct;

    MemClr(&ADC_InitStruct, sizeof(ADC_InitStruct));
    MemClr(&ADC_SqrInitStruct, sizeof(ADC_SqrInitStruct));

    // 使能外设时钟
    HAL_SYSCTRL_ADC_CLK_ENABLE();

    // 配置 ADC，单次转换模式
    ADC_InitStruct.WorkMode     = ADC_WORKMODE_ONESHOT;               // 单次转换模式
    ADC_InitStruct.ClockSource  = ADC_CLKSRC_DIV8;                    // ADCCLK = PCLK/8 = 6MHz
    ADC_InitStruct.BgrEn        = ADC_BGR_ENABLE;
    ADC_InitStruct.TempSensorEn = ADC_TS_DISABLE;
    HAL_ADC_Init(&ADC_InitStruct);

    HAL_ADC_Enable();                                                 // 使能ADC

    // 通过配置序列实现单通道采样：序列转换数量、序列通道的模拟输入源、序列通道的采样时间
    ADC_SqrInitStruct.SqrEns    = ADC_ENS_SQRCH0;                     // 配置仅转换序列通道0
    ADC_SqrInitStruct.SqrCh0In  = ADC_IN_BGR1V2;                      // 配置序列通道0的模拟输入源为BGR1V2
    ADC_SqrInitStruct.SqrCh0Sam = ADC_SAMPLE_CLK262;                  // 采样TS和BGR时需要保证采样时间至少40uS, 因此采样时钟至少 = 40uS / (1/6MHz) = 240个
    HAL_ADC_AllSqrChannel_Config(&ADC_SqrInitStruct);
}


/*******************************************************************************
 ** EOF (not truncated)
 ******************************************************************************/
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
    /* USER CODE BEGIN */
    /* User can add his own implementation to report the file name and line number,
       tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    /* USER CODE END */
}
#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
